package cn.iocoder.yudao.module.reading.service.plan;

import cn.iocoder.yudao.module.reading.controller.app.plan.vo.PlanDailyTaskRespVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.plan.PlanDailyTaskDO;

import java.time.LocalDate;
import java.util.List;

/**
 * 计划每日任务 Service 接口
 *
 * @author 李晨
 */
public interface PlanDailyTaskService {

    /**
     * 创建计划任务
     *
     * @param task 任务信息
     * @return 任务ID
     */
    Long createTask(PlanDailyTaskDO task);

    /**
     * 批量创建计划任务
     *
     * @param tasks 任务列表
     */
    void batchCreateTasks(List<PlanDailyTaskDO> tasks);

    /**
     * 获取计划任务
     *
     * @param id 任务ID
     * @return 任务信息
     */
    PlanDailyTaskDO getTask(Long id);

    /**
     * 获取计划的任务列表
     *
     * @param planId 计划ID
     * @param status 任务状态（可选）
     * @return 任务列表
     */
    List<PlanDailyTaskDO> getTasksByPlanId(Long planId, String status);

    /**
     * 获取计划指定日期的任务
     *
     * @param planId   计划ID
     * @param taskDate 任务日期
     * @return 任务列表
     */
    List<PlanDailyTaskDO> getTasksByPlanIdAndDate(Long planId, LocalDate taskDate);

    /**
     * 获取用户指定日期的任务
     *
     * @param userId   用户ID
     * @param taskDate 任务日期
     * @return 任务列表
     */
    List<PlanDailyTaskDO> getTasksByUserIdAndDate(Long userId, LocalDate taskDate);

    /**
     * 完成任务
     *
     * @param taskId      任务ID
     * @param readingTime 阅读时长（秒）
     * @param notes       备注（可选）
     */
    void completeTask(Long taskId, Integer readingTime, String notes);

    /**
     * 根据绘本ID完成任务
     * 用于阅读记录完成时自动同步任务状态
     *
     * @param userId 用户ID
     * @param planId 计划ID
     * @param bookId 绘本ID
     */
    void completeTaskByBookId(Long userId, Long planId, Long bookId);

    /**
     * 根据绘本ID和任务类型完成任务
     * 用于更精确地控制任务完成逻辑
     *
     * @param userId 用户ID
     * @param planId 计划ID
     * @param bookId 绘本ID
     * @param preferredTaskType 优先任务类型（new_learning 或 review）
     */
    void completeTaskByBookIdAndType(Long userId, Long planId, Long bookId, String preferredTaskType);

    /**
     * 跳过任务
     *
     * @param taskId 任务ID
     * @param reason 原因（可选）
     */
    void skipTask(Long taskId, String reason);

    /**
     * 重置任务
     *
     * @param taskId 任务ID
     */
    void resetTask(Long taskId);

    /**
     * 删除计划的所有任务
     *
     * @param planId 计划ID
     */
    void deleteTasksByPlanId(Long planId);

    /**
     * 获取绘本的所有任务状态（用于调试和验证）
     *
     * @param planId 计划ID
     * @param bookId 绘本ID
     * @return 任务列表
     */
    List<PlanDailyTaskDO> getTaskStatusByBookId(Long planId, Long bookId);

    /**
     * 生成计划任务
     *
     * @param planId 计划ID
     */
    void generateTasks(Long planId);

    /**
     * 将任务列表转换为响应VO
     *
     * @param tasks 任务列表
     * @return 响应VO列表
     */
    List<PlanDailyTaskRespVO> convertToRespVO(List<PlanDailyTaskDO> tasks);

}
